home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 10 / FM Towns Free Software Collection 10.iso / ms_dos / tool / fapxtool / src / txl / txlcfexp.c < prev    next >
C/C++ Source or Header  |  1995-02-14  |  2KB  |  107 lines

  1. /***************
  2. *
  3. *   txlcfexp.c    コマンドファイル展開
  4. */
  5.  
  6. #include "txl.h"
  7.  
  8. void readcf(char *fname, int *allocsize, int *usesize, int *paracnt)
  9. {
  10.     int rsize, i;
  11.     FILE *fp;
  12.     struct stat stbuf;
  13.     char *baseptr = cfwork+*usesize;
  14.  
  15.     if (*paracnt >= OP_MAX) {
  16.         return;
  17.     }
  18.     if (stat(fname, &stbuf)) {
  19.         return;
  20.     }
  21.     while (*usesize + stbuf.st_size > *allocsize) {
  22.         (*allocsize) += 1024;
  23.         cfwork = realloc(cfwork, *allocsize);
  24.     }
  25.  
  26.     if ((fp = fopen(fname, "rt")) == NULL) {
  27.         return;
  28.     }
  29.     rsize = fread(baseptr, 1, stbuf.st_size, fp);
  30.     *usesize += rsize;
  31.     *(cfwork + *usesize) = NUL;
  32.     (*usesize)++;
  33.  
  34.     
  35.     for (i = 0; i < rsize; i++) {
  36.         if (*(baseptr + i) > ' ') {            /* not space ? */
  37.             if (*(baseptr + i) == '@') {
  38.                 log_bufptr = baseptr + i + 1;    /* log_bufptr is temporary */
  39.                 while (*log_bufptr > ' ') log_bufptr++;
  40.                 *log_bufptr = NUL;
  41.                 readcf((baseptr + i + 1), allocsize, usesize, paracnt);
  42.             }
  43.             else {
  44.                 cfptr[*paracnt] = baseptr+i;
  45.             }
  46.             if (*(baseptr + i) == 0x22) {    /* double quote */
  47.                 cfptr[*paracnt]++;
  48.                 i++;
  49.                 while (*(baseptr + i) != 0x22) {
  50.                     i++;
  51.                     if (*(baseptr + i) == NUL) {
  52.                         return;
  53.                     }
  54.                 }
  55.                 *(baseptr + i) = NUL;
  56.             }
  57.             else {
  58.                 while (*(baseptr + i) > ' ') i++;
  59.             }
  60.             (*paracnt)++;
  61.             if (*paracnt >= OP_MAX) {
  62.                 return;
  63.             }
  64.         }
  65.         *(baseptr + i) = NUL;
  66.     }
  67.  
  68. }
  69.  
  70. void cfexpand(int count, char *val[])
  71. {
  72.     int i, allocsize = 0, usesize = 0, paracnt = 0;
  73.     int expandflg = FALSE;
  74.  
  75.     for (i = 0; i < count; i++) {    /* プレスキャン */
  76.         if (val[i][0] == '@') {
  77.             expandflg = TRUE;
  78.         }
  79.     }
  80.  
  81.     if (!expandflg) {
  82.         swchk(count, val);
  83.         Exit(0);
  84.     }
  85.  
  86.     allocsize = 1024;
  87.     cfwork = malloc(1024);
  88.  
  89.     for (i = 0; i < count; i++) {    /* 実スキャン */
  90.         if (val[i][0] == '@') {
  91.             readcf(&(val[i][1]), &allocsize, &usesize, ¶cnt);
  92.         }
  93.         else {
  94.             cfptr[paracnt] = val[i];
  95.             paracnt++;
  96.         }
  97.         if (paracnt >= OP_MAX) {
  98.             free(cfwork);
  99.             Exit(1);
  100.         }
  101.     }
  102.  
  103.     swchk(paracnt, cfptr);
  104.     Exit(0);
  105. }
  106.  
  107.